<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 1- 基本数据类型中的赋值是深复制还是浅复制。
	//   只是赋值。如果非要有一个答案，那么是深复制。
	// let a = 1;
	// let b = a;
	// b =90;
	// console.log(a);// 1
	
	// 2- 引用类型中的赋值是深复制还是浅复制
	// 浅复制
	// const arr = [1,2,3,4];
	// const arr2 = arr;
	// arr2[2] = 100;
	// console.log(arr);// [1, 2, 100, 4]
	
	// 3- 引用类型(对象的属性是值类型，数组的元素是值类型)中以下情况是深复制
	// 数组
	// const arr = [1,2,3,4];
	// const arr2 = [...arr];
	// const arr2 = arr.map(item=>item);
	// const arr2 = Array.from(arr);
	// const arr2 = [].concat(arr);
	// const arr2 = JSON.parse(JSON.stringify(arr));
	// console.log(arr === arr2,arr2);// false
	// arr[1] = 200;
	// console.log(arr2[1]);// 2
	
	// 对象
	// const obj = {
	// 	a:1,
	// 	b:2
	// }
	// const obj2 = {...obj};
	// const obj2 = Object.assign({},obj);
	// const obj2 = JSON.parse(JSON.stringify(obj));
	// console.log(obj2 === obj,obj2);
	// obj2.a = 100;
	// console.log(obj.a);
	
	// 4- 引用类型如果复杂（数组的元素如果是引用类型，对象中的属性如果是引用类型），以下是浅复制
	// 数组
	// const arr = [{a:1}];
	// // const arr2 = [...arr];
	// // const arr2 = arr.map(item=>item);
	// const arr2 = [].concat(arr);
	// console.log(arr2 === arr);// false
	// console.log(arr2[0] === arr[0]);// true
	// arr2[0].a = 100;
	// console.log(arr[0].a);// 100
	
	// 复杂
	// const obj = {
	// 	info:{
	// 		userName:"zhangsan"
	// 	}
	// }
	// const obj2 = {...obj};
	// const obj2 = Object.assign({},obj);
	// console.log(obj2 === obj);// false
	// console.log(obj2.info === obj.info);// true
	// obj2.info.userName = "lisi";
	// console.log(obj.info.userName);// lisi
	
	// 5- 解构赋值是深复制吗？答：不是
	// const info = {userName:"zhangsan"};
	// const [a,b,c] = [1,2,info];
	// console.log(c === info);// true
	
	// const obj = {
	// 	a:1,
	// 	info:{}
	// }
	// const {a,info} = obj;
	// console.log(a === obj.a,info === obj.info);
	
	
	// 6- 如何对复杂引用类型实现深复制
	const obj = {
		a:1,
		b:2,
		c:3,
		info:{
			a:200,
			list:[1,2,3]
		},
		arr:[],
		fn(){
		
		}
	}
	// 可以实现属性非函数的深复制。
	// const obj2 = JSON.parse(JSON.stringify(obj));
	// obj2.info.a = 100;
	// console.log(obj,obj2);// 200
	function deepClone(source){
		let result = Array.isArray(source)?[]:{};
		for(let key in source){
			if(source[key] && typeof source[key]==="object"){
				result[key] = deepClone(source[key]);
			}else
				result[key] = source[key];
		}
		return result;
	}
	const obj2 = deepClone(obj);
	console.log(obj2 === obj,obj2);
	console.log(obj2.info === obj.info);// false
	console.log(obj2.arr === obj.arr);// false
	console.log(obj2.info.list===obj.info.list);
	
	
	
	
</script>
</html>